#Tarea 05 #Mineria de Datos I #Ricardo Zamora Mennigke

library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------ tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.5
## v tidyr   1.0.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts --------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggplot2)
library(dplyr)
library(glue)
## 
## Attaching package: 'glue'
## The following object is masked from 'package:dplyr':
## 
##     collapse
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor

Pregunta 1: [25 puntos] En este ejercicio usaremos los datos (voces.csv). Se trata de un problema de reconocimiento de g´enero mediante el an´alisis de la voz y el habla. Esta base de datos fue creada para identificar una voz como masculina o femenina, bas´andose en las propiedades ac´usticas de la voz y el habla. El conjunto de datos consta de 3.168 muestras de voz grabadas, recogidas de hablantes masculinos y femeninos. Las muestras de voz se preprocesan mediante an´alisis ac´ustico en R, utilizando los paquetes de ondas marinas y de sinton´ıa de R, con un rango de frecuencia analizada de 0hz-280hz (rango vocal humano). El conjunto de datos tiene las siguientes propiedades ac´usticas (variables) de cada voz:

Realice lo siguiente:

  1. Cargue la tabla de datos voces.csv en R. No olvide recodificar la variable a predecir como categorica.
equilibrio.variable.predecir <- function(datos, variable.predecir, ylab = "Cantidad de individuos", 
                                        xlab = "", main = paste("Distribución de la variable",variable.predecir), col = NA) {
  gg_color <- function (n) {
     hues <- seq(15, 375, length = n + 1)
     hcl(h = hues, l = 65, c = 100)[1:n]
  }
  if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
    stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
  }
  if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
    if(length(col) == 0 || is.na(col)){
      col <- gg_color(length(unique(datos[,variable.predecir])))
    }else{
      col <- rep(col,length(unique(datos[,variable.predecir])))
    }
    ggplot(data = datos, mapping = aes_string(x = variable.predecir, fill = variable.predecir)) +
      geom_bar() +
      scale_fill_manual(values = col, name = variable.predecir) +
      labs(x = xlab, y = ylab, title = main) +
      theme_minimal() +
      theme(legend.position = "bottom")
  }else{
    stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
  }
}

poder.predictivo.numerica <- function(datos, variable.predecir, variable.comparar, ylab = "", 
                                       xlab = "", main = paste("Densidad de la variable", variable.comparar, 'según', variable.predecir), col = NA){
  gg_color <- function (n) {
     hues <- seq(15, 375, length = n + 1)
     hcl(h = hues, l = 65, c = 100)[1:n]
  }
  if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
    stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
  }
  if(missing(variable.comparar) | !(variable.comparar %in% colnames(datos)) | !is.numeric(datos[,variable.comparar])){
    stop("variable.comparar tiene que ser ingresada y ser un nombre de columna numérica", call. = FALSE )
  }
  
  if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
    if(length(col) == 0 || is.na(col)){
      col <- gg_color(length(unique(datos[,variable.predecir])))
    }else{
      col <- rep(col,length(unique(datos[,variable.predecir])))
    }
    
    ggplot(data = datos, aes_string(variable.comparar, fill = variable.predecir)) +
      geom_density(alpha = .7, color = NA) +
      scale_fill_manual(values = col) +
      labs(title = main , y = ylab, x = xlab ,fill = variable.predecir) +
      theme_minimal() +
      theme(legend.position = 'bottom',
            legend.title = element_blank(),
            text = element_text(size = 15))
    
  }else{
    stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
  }
}

poder.predictivo.categorica <- function(datos, variable.predecir, variable.comparar, ylab = "", 
                                        xlab = "", main = paste("Densidad de la variable", variable.comparar, 'según', variable.predecir), col = NA) {
  gg_color <- function (n) {
     hues <- seq(15, 375, length = n + 1)
     hcl(h = hues, l = 65, c = 100)[1:n]
  }
  if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
    stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
  }
  if(missing(variable.comparar) | !(variable.comparar %in% colnames(datos)) | 
     !(is.factor(datos[,variable.comparar]) | is.character(datos[,variable.comparar])) ){
    stop("variable.comparar tiene que ser ingresada y ser un nombre de columna categórica", call. = FALSE )
  }
  
  if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
    if(length(col) == 0 || is.na(col)){
      col <- gg_color(length(unique(datos[,variable.predecir])))
    }else{
      col <- rep(col,length(unique(datos[,variable.predecir])))
    }
    
    datos2 <- datos %>%
      dplyr::group_by_(variable.comparar, variable.predecir) %>%
      dplyr::summarise(count = n())
    
    if(variable.comparar != variable.predecir){
      datos2 <-   datos2 %>% dplyr::group_by_(variable.comparar)
    }
    datos2 <- datos2 %>% dplyr::mutate(prop = round(count/sum(count),4))
  
    ggplot(data = datos2, mapping = aes_string(x = variable.comparar, y = "prop", fill = variable.predecir)) +
      geom_col(position = "fill") +
      geom_text(aes(label = glue("{percent(prop)} ({count})")), position = position_stack(vjust = .5), color = "white") +
      scale_y_continuous(label = percent) +
      labs(y =  xlab, x  = ylab, title = main) +
      scale_fill_manual(values = col, name = variable.predecir) +
      theme(legend.position = "bottom")+
      coord_flip()
    
  }else{
    stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
  }
}
# Índices para matrices NxN
indices.general <- function(MC) {
  precision.global <- sum(diag(MC))/sum(MC)
  error.global <- 1 - precision.global
  precision.categoria <- diag(MC)/rowSums(MC)
  res <- list(matriz.confusion = MC, precision.global = precision.global, error.global = error.global, 
              precision.categoria = precision.categoria)
  names(res) <- c("Matriz de Confusión", "Precisión Global", "Error Global", 
                  "Precisión por categoría")
  return(res)
}
setwd("C:/Users/rzamoram/Documents/Machine Learning/Mineria de Datos I/Clase3")
datos<-read.csv("voces.csv",dec='.',header=T)
str(datos)
## 'data.frame':    3168 obs. of  21 variables:
##  $ meanfreq: num  0.0598 0.066 0.0773 0.1512 0.1351 ...
##  $ sd      : num  0.0642 0.0673 0.0838 0.0721 0.0791 ...
##  $ median  : num  0.032 0.0402 0.0367 0.158 0.1247 ...
##  $ Q25     : num  0.0151 0.0194 0.0087 0.0966 0.0787 ...
##  $ Q75     : num  0.0902 0.0927 0.1319 0.208 0.206 ...
##  $ IQR     : num  0.0751 0.0733 0.1232 0.1114 0.1273 ...
##  $ skew    : num  12.86 22.42 30.76 1.23 1.1 ...
##  $ kurt    : num  274.4 634.61 1024.93 4.18 4.33 ...
##  $ sp.ent  : num  0.893 0.892 0.846 0.963 0.972 ...
##  $ sfm     : num  0.492 0.514 0.479 0.727 0.784 ...
##  $ mode    : num  0 0 0 0.0839 0.1043 ...
##  $ centroid: num  0.0598 0.066 0.0773 0.1512 0.1351 ...
##  $ meanfun : num  0.0843 0.1079 0.0987 0.089 0.1064 ...
##  $ minfun  : num  0.0157 0.0158 0.0157 0.0178 0.0169 ...
##  $ maxfun  : num  0.276 0.25 0.271 0.25 0.267 ...
##  $ meandom : num  0.00781 0.00901 0.00799 0.2015 0.71281 ...
##  $ mindom  : num  0.00781 0.00781 0.00781 0.00781 0.00781 ...
##  $ maxdom  : num  0.00781 0.05469 0.01562 0.5625 5.48438 ...
##  $ dfrange : num  0 0.04688 0.00781 0.55469 5.47656 ...
##  $ modindx : num  0 0.0526 0.0465 0.2471 0.2083 ...
##  $ genero  : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 2 2 2 2 2 2 2 ...
datos$genero <- factor(datos$genero,ordered = TRUE) ##ya es un factor es una linea repetitiva pero que ordena 
equilibrio.variable.predecir(datos,"genero")

El problema esta visualmente equilibrado.

indices.general <- function(MC) {
  precision.global <- sum(diag(MC))/sum(MC)
  error.global <- 1 - precision.global
  precision.categoria <- diag(MC)/rowSums(MC)
  precision.positiva <- MC[2, 2]/(MC[2, 2] + MC[2, 1])
  precision.negativa <- MC[1, 1]/(MC[1, 1] + MC[1, 2])
  falsos.positivos <- 1 - precision.negativa
  falsos.negativos <- 1 - precision.positiva
  asertividad.positiva <- MC[2, 2]/(MC[1, 2] + MC[2, 2])
  asertividad.negativa <- MC[1, 1]/(MC[1, 1] + MC[2, 1])
  res <- list(matriz.confusion = MC, precision.global = precision.global, error.global = error.global, 
              precision.categoria = precision.categoria, precision.positiva = precision.positiva, precision.negativa=precision.negativa, 
              falsos.positivos=falsos.positivos, falsos.negativos=falsos.negativos, asertividad.positiva=asertividad.positiva,
              asertividad.negativa=asertividad.negativa)
  names(res) <- c("Matriz de Confusión", "Precisión Global", "Error Global", "Precisión por categoría", "Precision Positiva", "Precision Negativa",
                  "Falsos Positivos", "Falsos Negativos", "Asertividad Positiva", "Asertividad Negativa")
  return(res)
}
  1. Usando Maquinas de Soporte Vectorial, con todos los nucleos (kernel) (en traineR) con 80% de los datos para tabla aprendizaje y un 20% para la tabla testing genere modelos predictivos.
library(traineR)
library(traineR)

muestra <- sample(1:nrow(datos),floor(nrow(datos)*0.20))
ttesting <- datos[muestra,]
taprendizaje <- datos[-muestra,]
modelo <- train.svm(genero ~ .,data = taprendizaje, kernel = "radial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       317         6
##   Masculino        6       304
## 
## $`Precisión Global`
## [1] 0.9810427
## 
## $`Error Global`
## [1] 0.01895735
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9814241 0.9806452 
## 
## $`Precision Positiva`
## [1] 0.9806452
## 
## $`Precision Negativa`
## [1] 0.9814241
## 
## $`Falsos Positivos`
## [1] 0.01857585
## 
## $`Falsos Negativos`
## [1] 0.01935484
## 
## $`Asertividad Positiva`
## [1] 0.9806452
## 
## $`Asertividad Negativa`
## [1] 0.9814241
library(traineR)

modelo <- train.svm(genero ~ .,data = taprendizaje, kernel = "polynomial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       298        25
##   Masculino        3       307
## 
## $`Precisión Global`
## [1] 0.9557662
## 
## $`Error Global`
## [1] 0.04423381
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9226006 0.9903226 
## 
## $`Precision Positiva`
## [1] 0.9903226
## 
## $`Precision Negativa`
## [1] 0.9226006
## 
## $`Falsos Positivos`
## [1] 0.07739938
## 
## $`Falsos Negativos`
## [1] 0.009677419
## 
## $`Asertividad Positiva`
## [1] 0.9246988
## 
## $`Asertividad Negativa`
## [1] 0.9900332
library(traineR)

modelo <- train.svm(genero ~ .,data = taprendizaje, kernel = "sigmoid")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       287        36
##   Masculino       40       270
## 
## $`Precisión Global`
## [1] 0.8799368
## 
## $`Error Global`
## [1] 0.1200632
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.8885449 0.8709677 
## 
## $`Precision Positiva`
## [1] 0.8709677
## 
## $`Precision Negativa`
## [1] 0.8885449
## 
## $`Falsos Positivos`
## [1] 0.1114551
## 
## $`Falsos Negativos`
## [1] 0.1290323
## 
## $`Asertividad Positiva`
## [1] 0.8823529
## 
## $`Asertividad Negativa`
## [1] 0.8776758
library(traineR)

modelo <- train.svm(genero ~ .,data = taprendizaje, kernel = "linear")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       315         8
##   Masculino        9       301
## 
## $`Precisión Global`
## [1] 0.9731438
## 
## $`Error Global`
## [1] 0.02685624
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9752322 0.9709677 
## 
## $`Precision Positiva`
## [1] 0.9709677
## 
## $`Precision Negativa`
## [1] 0.9752322
## 
## $`Falsos Positivos`
## [1] 0.0247678
## 
## $`Falsos Negativos`
## [1] 0.02903226
## 
## $`Asertividad Positiva`
## [1] 0.97411
## 
## $`Asertividad Negativa`
## [1] 0.9722222
library(traineR)

modelo <- train.svm(genero ~ .,data = taprendizaje, kernel = "radial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       317         6
##   Masculino        6       304
## 
## $`Precisión Global`
## [1] 0.9810427
## 
## $`Error Global`
## [1] 0.01895735
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9814241 0.9806452 
## 
## $`Precision Positiva`
## [1] 0.9806452
## 
## $`Precision Negativa`
## [1] 0.9814241
## 
## $`Falsos Positivos`
## [1] 0.01857585
## 
## $`Falsos Negativos`
## [1] 0.01935484
## 
## $`Asertividad Positiva`
## [1] 0.9806452
## 
## $`Asertividad Negativa`
## [1] 0.9814241
library(traineR)

modelo <- train.svm(genero ~ .,data = taprendizaje)
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       317         6
##   Masculino        6       304
## 
## $`Precisión Global`
## [1] 0.9810427
## 
## $`Error Global`
## [1] 0.01895735
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9814241 0.9806452 
## 
## $`Precision Positiva`
## [1] 0.9806452
## 
## $`Precision Negativa`
## [1] 0.9814241
## 
## $`Falsos Positivos`
## [1] 0.01857585
## 
## $`Falsos Negativos`
## [1] 0.01935484
## 
## $`Asertividad Positiva`
## [1] 0.9806452
## 
## $`Asertividad Negativa`
## [1] 0.9814241

El mejor SVM para este ejercicio es con el default kernel, el radial.

  1. Con la tabla de testing calcule la matriz de confusi´on, la precisi´on, la precisi´on positiva, la precisi´on negativa, los falsos positivos, los falsos negativos, la acertividad positiva y la acertividad negativa. Compare los resultados con los obtenidos en las tareas anteriores ¿Cual es mejor?
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##            prediction
## real        Femenino Masculino
##   Femenino       317         6
##   Masculino        6       304
## 
## $`Precisión Global`
## [1] 0.9810427
## 
## $`Error Global`
## [1] 0.01895735
## 
## $`Precisión por categoría`
##  Femenino Masculino 
## 0.9814241 0.9806452 
## 
## $`Precision Positiva`
## [1] 0.9806452
## 
## $`Precision Negativa`
## [1] 0.9814241
## 
## $`Falsos Positivos`
## [1] 0.01857585
## 
## $`Falsos Negativos`
## [1] 0.01935484
## 
## $`Asertividad Positiva`
## [1] 0.9806452
## 
## $`Asertividad Negativa`
## [1] 0.9814241

El mejor SVM para este ejercicio es con el default kernel, el radial. Posee una precision bastante alta de 0.9873618. Para este ejercicio parece ser el metodo el que mejor se ha ajustado. El arbol de decisio con una precision global de 0.9462875, estuvo mas bajo. Ademas otras estimaciones tardan mas, es decir, redes tarda mas entre mas cantidad de nodos, pero la precision global y el error global en los tres casos de redes se mantienen entre 97 y 98%, y 2% y 3%, respectivamente. De los seis modelos (svm, arbol, 3 redes, kvecinos) tomando precision global como criterio principal y revisando un poco la precision de categorias, SVM radial en este caso tiene la precision mas alta , pero se denota que no existe diferencia significativa, ya que siguiendo la finalidad de este ejercicio se realizan distintas simulaciones para comparar. En la mayoria de los casos la precision de la red neuronal especialmente la de 4 nodos se acerca a la que mejor estimacion de svm radial, pero todas las estimaciones usando k vecinos y redes neuronales con distinta cantidad de nodos, han dado precisiones de entre 96,68% y 98,26% como ocurrio en el de 4 nodos contra 15 nodos, es decir, no se notan diferencias significativas. Los svm con otros kernels tambien han sido bastante acertados, de hecho, puede ser la muestra la que influya en la decision.

Pregunta 2: [25 puntos] En esta pregunta utiliza los datos (tumores.csv). Se trata de un conjunto de datos de caracter´ısticas del tumor cerebral que incluye cinco variables de primer orden y ocho de textura y cuatro par´ametros de evaluaci´on de la calidad con el nivel objetivo. La variables son: Media, Varianza, Desviaci´on est´andar, Asimetr´ıa, Kurtosis, Contraste, Energ´ıa, ASM (segundo momento angular), Entrop´ıa, Homogeneidad, Disimilitud, Correlaci´on, Grosor, PSNR (Pico de la relaci´on se˜nal-ruido), SSIM (´Indice de Similitud Estructurada), MSE (Mean Square Error), DC (Coeficiente de Dados) y la variable a predecir tipo (1 = Tumor, 0 = No-Tumor).

Realice lo siguiente:

  1. Cargue la tabla de datos tumores.csv en R y genere en R usando la funci´on createDataPartition(…) del paquete caret la tabla de testing con una 25 % de los datos y con el resto de los datos genere una tabla de aprendizaje.
setwd("C:/Users/rzamoram/Documents/Machine Learning/Mineria de Datos I/Clase2")
data1<-read.csv("tumores.csv",dec='.',header=T)
head(data1)
##   imagen     media  varianza desviacion.estandar  entropia asimetria  kurtosis
## 1 Image1 23.448517 2538.9856            50.38835 0.6511741  1.984202  5.421042
## 2 Image2  4.398331  834.8530            28.89382 0.9535317  6.495203 43.349355
## 3 Image3  3.244263  642.0592            25.33889 0.9660645  7.772860 61.756034
## 4 Image4  8.511353 1126.2142            33.55911 0.8687651  3.763142 15.107579
## 5 Image5 21.000793 2235.3170            47.27914 0.6847244  1.936029  4.722343
## 6 Image7 11.350555  998.9722            31.60652 0.7611065  2.533920  7.394586
##   contraste   energia       asm homogeneidad disiminitud correlacion      psnr
## 1 181.46771 0.7815569 0.6108312    0.8470333   2.7654114   0.9685761  97.97463
## 2  76.74589 0.9727695 0.9462805    0.9807616   0.5486053   0.9597505 110.34660
## 3  81.75241 0.9801609 0.9607154    0.9850659   0.5404114   0.9442587 112.26630
## 4 362.29121 0.9217862 0.8496899    0.9492953   2.7657252   0.8590271 101.95579
## 5 312.43923 0.8041836 0.6467113    0.8803008   3.0066597   0.9385719  97.63987
## 6 303.94798 0.8542768 0.7297889    0.9023554   3.4405509   0.8664795  99.20658
##        ssim         mse        dc tipo
## 1 0.7770111 0.171163194 0.3039887    1
## 2 0.9779528 0.009913194 0.8390189    1
## 3 0.9853620 0.006371528 0.8497749    1
## 4 0.8810152 0.068437500 0.0000000    0
## 5 0.7663084 0.184878472 0.0000000    0
## 6 0.7948807 0.128888889 0.0000000    0
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:traineR':
## 
##     contr.dummy
## The following object is masked from 'package:purrr':
## 
##     lift
data1$tipo <- factor(data1$tipo,ordered = TRUE)
str(data1)
## 'data.frame':    1275 obs. of  18 variables:
##  $ imagen             : Factor w/ 1275 levels "Image1","Image10",..: 1 614 698 790 871 1030 1108 1194 2 85 ...
##  $ media              : num  23.45 4.4 3.24 8.51 21 ...
##  $ varianza           : num  2539 835 642 1126 2235 ...
##  $ desviacion.estandar: num  50.4 28.9 25.3 33.6 47.3 ...
##  $ entropia           : num  0.651 0.954 0.966 0.869 0.685 ...
##  $ asimetria          : num  1.98 6.5 7.77 3.76 1.94 ...
##  $ kurtosis           : num  5.42 43.35 61.76 15.11 4.72 ...
##  $ contraste          : num  181.5 76.7 81.8 362.3 312.4 ...
##  $ energia            : num  0.782 0.973 0.98 0.922 0.804 ...
##  $ asm                : num  0.611 0.946 0.961 0.85 0.647 ...
##  $ homogeneidad       : num  0.847 0.981 0.985 0.949 0.88 ...
##  $ disiminitud        : num  2.765 0.549 0.54 2.766 3.007 ...
##  $ correlacion        : num  0.969 0.96 0.944 0.859 0.939 ...
##  $ psnr               : num  98 110.3 112.3 102 97.6 ...
##  $ ssim               : num  0.777 0.978 0.985 0.881 0.766 ...
##  $ mse                : num  0.17116 0.00991 0.00637 0.06844 0.18488 ...
##  $ dc                 : num  0.304 0.839 0.85 0 0 ...
##  $ tipo               : Ord.factor w/ 2 levels "0"<"1": 2 2 2 1 1 1 2 2 2 2 ...
equilibrio.variable.predecir(data1,"tipo")

Es un problema desbalanceado

intrain <- createDataPartition(
  y = data1$tipo,
  p = .75,
  list = FALSE
)
str(intrain)
##  int [1:957, 1] 2 4 5 7 8 9 10 11 12 15 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr "Resample1"
taprendizaje <- data1[ intrain,]
ttesting  <- data1[-intrain,]

nrow(taprendizaje)
## [1] 957
nrow(ttesting)
## [1] 318
  1. Usando M´aquinas de Soporte Vectorial, con todos los n´ucleos (kernel) (en traineR) genere un modelos predictivos para la tabla de aprendizaje.
modelo <- train.svm(tipo ~ .,data = taprendizaje, kernel = "radial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##     prediction
## real   0   1
##    0   0  24
##    1   0 294
## 
## $`Precisión Global`
## [1] 0.9245283
## 
## $`Error Global`
## [1] 0.0754717
## 
## $`Precisión por categoría`
## 0 1 
## 0 1 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0
## 
## $`Falsos Positivos`
## [1] 1
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9245283
## 
## $`Asertividad Negativa`
## [1] NaN
library(traineR)

modelo <- train.svm(tipo ~ .,data = taprendizaje, kernel = "linear")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##     prediction
## real   0   1
##    0  22   2
##    1  11 283
## 
## $`Precisión Global`
## [1] 0.9591195
## 
## $`Error Global`
## [1] 0.0408805
## 
## $`Precisión por categoría`
##         0         1 
## 0.9166667 0.9625850 
## 
## $`Precision Positiva`
## [1] 0.962585
## 
## $`Precision Negativa`
## [1] 0.9166667
## 
## $`Falsos Positivos`
## [1] 0.08333333
## 
## $`Falsos Negativos`
## [1] 0.03741497
## 
## $`Asertividad Positiva`
## [1] 0.9929825
## 
## $`Asertividad Negativa`
## [1] 0.6666667
library(traineR)

modelo <- train.svm(tipo ~ .,data = taprendizaje, kernel = "sigmoid")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##     prediction
## real   0   1
##    0   0  24
##    1   0 294
## 
## $`Precisión Global`
## [1] 0.9245283
## 
## $`Error Global`
## [1] 0.0754717
## 
## $`Precisión por categoría`
## 0 1 
## 0 1 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0
## 
## $`Falsos Positivos`
## [1] 1
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9245283
## 
## $`Asertividad Negativa`
## [1] NaN
library(traineR)

modelo <- train.svm(tipo ~ .,data = taprendizaje, kernel = "polynomial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##     prediction
## real   0   1
##    0   0  24
##    1   0 294
## 
## $`Precisión Global`
## [1] 0.9245283
## 
## $`Error Global`
## [1] 0.0754717
## 
## $`Precisión por categoría`
## 0 1 
## 0 1 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0
## 
## $`Falsos Positivos`
## [1] 1
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9245283
## 
## $`Asertividad Negativa`
## [1] NaN
modelo <- train.svm(tipo ~ .,data = taprendizaje)
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##     prediction
## real   0   1
##    0   0  24
##    1   0 294
## 
## $`Precisión Global`
## [1] 0.9245283
## 
## $`Error Global`
## [1] 0.0754717
## 
## $`Precisión por categoría`
## 0 1 
## 0 1 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0
## 
## $`Falsos Positivos`
## [1] 1
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9245283
## 
## $`Asertividad Negativa`
## [1] NaN

Ninguno de los kernels esta logrando estimar correctamente los casos de no tumor.Todos los kernels dan la misma matrix de confusion, excepto el linear que permite identificar ambos casos y tiene la precision global mas alta con 0.9716981, pero una asertividad negativa aun baja de 0.7777778.

  1. Construya una tabla para los ´ındices anteriores que permita comparar el resultado de Maquinas de Soporte Vectorial con respecto a los m´etodos generados en las tareas anteriores ¿Cu´al m´etodo es mejor?
x <- data.frame("Modelo" = c("Modelo k-vecinos", "Modelo kvecinos.traineR", "Modelo Red 2 nodos", "Modelo Arbol Decision", "SVM radial", "SVM Linear", "SVM Sigmoid", "SVM polynomial"), "Precision Global" = c(0.9559748, 0.9402516, 0.9497, 0.9717, 0.9245283, 0.9748428, 0.9245283, 0.9245283), "Error Global" = c(0.04402516, 0.05974843, 0.0503, 0.0283, 0.0754717, 0.02515723, 0.0754717,0.0754717))
x
##                    Modelo Precision.Global Error.Global
## 1        Modelo k-vecinos        0.9559748   0.04402516
## 2 Modelo kvecinos.traineR        0.9402516   0.05974843
## 3      Modelo Red 2 nodos        0.9497000   0.05030000
## 4   Modelo Arbol Decision        0.9717000   0.02830000
## 5              SVM radial        0.9245283   0.07547170
## 6              SVM Linear        0.9748428   0.02515723
## 7             SVM Sigmoid        0.9245283   0.07547170
## 8          SVM polynomial        0.9245283   0.07547170

Ninguno de los kernels esta logrando estimar correctamente los casos de no tumor.Todos los kernels dan la misma matrix de confusion, excepto el linear que permite identificar ambos casos y tiene la precision global mas alta con 0.9716981, pero una asertividad negativa aun baja de 0.7777778.Comparando de forma sencillo los modelos mas acertados en las tareas anteriores, ya que se han dado varios intentos con resultados de toda clase. El SVM linear parece ser en este ejercicio el que mejor esta asimilando los datos para explicar la variabilidad del caso. Tiene una precision global bastante alta. De hecho, todos los casos probables de no tumor los identifica. Aun asi debe indicarse que se trata con tumores, lo implica que se necesita replantear el modelo, dado que se trata de tumores, lo que es mas importante, es probable que se requier un tamano de muestra mas grande para arrojar datos veridicos ya que en este caso los modelos no estan leyendo completamente bien los casos. En el caso de todos los modelos la precision por categoria ha sido especialmente debil al no detectar los no tumores, esto se explica probablemente por la falta de muestra en estos casos.

Pregunta 3: [25 puntos] En este ejercicio vamos a predecir n´umeros escritos a mano (Hand Written Digit Recognition), la tabla de de datos est´a en el archivo ZipData 2020.csv. En la figura siguiente se ilustran los datos

Para esto realice lo siguiente (podr´ıa tomar varios minutos los calculos):

  1. Cargue la tabla de datos ZipData 2020.csv en R.
setwd("C:/Users/rzamoram/Documents/Machine Learning/Mineria de Datos I/Clase3")
data2<-read.csv("ZipData_2020.csv",sep=";",dec='.',header=T)
head(data2)
##   Numero V2 V3 V4     V5     V6     V7     V8     V9    V10    V11    V12
## 1   seis -1 -1 -1 -1.000 -1.000 -1.000 -1.000 -0.631  0.862 -0.167 -1.000
## 2  cinco -1 -1 -1 -0.813 -0.671 -0.809 -0.887 -0.671 -0.853 -1.000 -1.000
## 3 cuatro -1 -1 -1 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.996  0.147
## 4  siete -1 -1 -1 -1.000 -1.000 -0.273  0.684  0.960  0.450 -0.067 -0.679
## 5   tres -1 -1 -1 -1.000 -1.000 -0.928 -0.204  0.751  0.466  0.234 -0.809
## 6   seis -1 -1 -1 -1.000 -1.000 -0.397  0.983 -0.535 -1.000 -1.000 -1.000
##      V13    V14    V15    V16 V17 V18 V19 V20    V21    V22    V23    V24
## 1 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1 -1.000 -1.000 -1.000 -0.992
## 2 -0.774 -0.180  0.052 -0.241  -1  -1  -1  -1  0.392  1.000  0.857  0.727
## 3  1.000 -0.189 -1.000 -1.000  -1  -1  -1  -1 -1.000 -1.000 -1.000 -1.000
## 4 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1 -1.000 -0.114  0.974  0.917
## 5 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1 -1.000 -0.370  0.739  1.000
## 6 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1 -1.000 -1.000  0.692  0.536
##      V25    V26    V27    V28    V29    V30    V31    V32 V33 V34 V35 V36
## 1  0.297  1.000  0.307 -1.000 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1
## 2  1.000  0.805  0.613  0.613  0.860  1.000  1.000  0.396  -1  -1  -1  -1
## 3 -1.000 -1.000 -0.882  1.000  0.390 -0.811 -1.000 -1.000  -1  -1  -1  -1
## 4  0.734  0.994  1.000  0.973  0.391 -0.421 -0.976 -1.000  -1  -1  -1  -1
## 5  1.000  1.000  1.000  0.644 -0.890 -1.000 -1.000 -1.000  -1  -1  -1  -1
## 6 -0.767 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1
##      V37    V38    V39    V40    V41    V42    V43    V44    V45 V46    V47
## 1 -1.000 -1.000 -1.000 -0.410  1.000  0.986 -0.565 -1.000 -1.000  -1 -1.000
## 2 -0.548  1.000  1.000  1.000  1.000  1.000  1.000  1.000  1.000   1  1.000
## 3 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.715  1.000  0.029  -1 -1.000
## 4 -0.323  0.991  0.622 -0.738 -1.000 -0.639  0.023  0.871  1.000   1 -0.432
## 5 -1.000  0.616  1.000  0.688 -0.455 -0.731  0.659  1.000 -0.287  -1 -1.000
## 6 -1.000 -0.921  0.928 -0.118 -1.000 -1.000 -1.000 -1.000 -1.000  -1 -1.000
##      V48    V49 V50 V51 V52    V53    V54    V55    V56 V57    V58    V59
## 1 -1.000 -1.000  -1  -1  -1 -1.000 -1.000 -0.683  0.825   1  0.562 -1.000
## 2  0.875 -0.957  -1  -1  -1 -0.786  0.961  1.000  1.000   1  0.727  0.403
## 3 -1.000 -1.000  -1  -1  -1 -1.000 -0.888 -0.912 -1.000  -1 -1.000 -0.549
## 4 -1.000 -1.000  -1  -1  -1  0.409  1.000  0.000 -1.000  -1 -1.000 -1.000
## 5 -1.000 -1.000  -1  -1  -1 -1.000 -0.376 -0.186 -0.874  -1 -1.000 -0.014
## 6 -1.000 -1.000  -1  -1  -1 -1.000 -0.394  1.000 -0.596  -1 -1.000 -1.000
##      V60    V61    V62    V63   V64 V65 V66 V67    V68    V69    V70    V71
## 1 -1.000 -1.000 -1.000 -1.000 -1.00  -1  -1  -1 -1.000 -1.000 -0.938  0.540
## 2  0.403  0.171 -0.314 -0.314 -0.94  -1  -1  -1 -1.000 -0.298  1.000  1.000
## 3  1.000  0.361 -1.000 -1.000 -1.00  -1  -1  -1 -1.000 -0.938  0.694  0.057
## 4 -0.842  0.714  1.000 -0.534 -1.00  -1  -1  -1 -0.879  0.965  1.000 -0.713
## 5  1.000 -0.253 -1.000 -1.000 -1.00  -1  -1  -1 -1.000 -1.000 -1.000 -1.000
## 6 -1.000 -1.000 -1.000 -1.000 -1.00  -1  -1  -1 -1.000 -1.000  0.060  0.900
##      V72    V73    V74    V75    V76    V77    V78    V79 V80 V81 V82 V83
## 1  1.000  0.778 -0.715 -1.000 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1
## 2  1.000  0.440  0.056 -0.755 -1.000 -1.000 -1.000 -1.000  -1  -1  -1  -1
## 3 -1.000 -1.000 -1.000 -0.382  1.000  0.511 -1.000 -1.000  -1  -1  -1  -1
## 4 -1.000 -1.000 -1.000 -1.000 -0.606  0.977  0.695 -0.906  -1  -1  -1  -1
## 5 -1.000 -1.000 -0.978  0.501  1.000 -0.540 -1.000 -1.000  -1  -1  -1  -1
## 6 -0.951 -1.000 -1.000 -1.000 -0.647  0.455 -0.333 -1.000  -1  -1  -1  -1
##      V84    V85    V86    V87    V88    V89    V90    V91    V92    V93    V94
## 1 -1.000 -1.000  0.100  1.000  0.922 -0.439 -1.000 -1.000 -1.000 -1.000 -1.000
## 2 -1.000  0.366  1.000  1.000  1.000  1.000  1.000  0.889 -0.081 -0.920 -1.000
## 3 -1.000 -0.311  1.000 -0.043 -1.000 -1.000 -1.000 -0.648  1.000  0.644 -1.000
## 4 -0.528  1.000  0.931 -0.888 -1.000 -1.000 -1.000 -0.949  0.559  0.984 -0.363
## 5 -1.000 -1.000 -1.000 -0.998 -0.341  0.296  0.371  1.000  0.417 -0.989 -1.000
## 6 -1.000 -1.000  0.259  0.676 -1.000 -1.000 -1.000 -0.984  0.677  0.981  0.551
##   V95 V96 V97 V98 V99  V100   V101   V102   V103   V104   V105  V106   V107
## 1  -1  -1  -1  -1  -1 -1.00 -0.257  0.950  1.000 -0.162 -1.000 -1.00 -1.000
## 2  -1  -1  -1  -1  -1 -1.00 -0.396  0.886  0.974  0.851  0.851  0.95  1.000
## 3  -1  -1  -1  -1  -1 -1.00  0.489  1.000 -0.493 -1.000 -1.000 -1.00 -0.564
## 4  -1  -1  -1  -1  -1 -0.97 -0.266 -0.555 -1.000 -1.000 -1.000 -1.00 -0.186
## 5  -1  -1  -1  -1  -1 -1.00 -1.000 -1.000 -0.008  1.000  1.000  1.00  1.000
## 6  -1  -1  -1  -1  -1 -1.00 -0.994  0.699  0.305 -1.000 -1.000 -1.00 -0.499
##     V108   V109   V110 V111 V112 V113 V114 V115   V116   V117   V118   V119
## 1 -0.987 -0.714 -0.832   -1   -1   -1   -1   -1 -0.797  0.909  1.000  0.300
## 2  1.000  0.539 -0.754   -1   -1   -1   -1   -1 -1.000 -1.000 -0.886 -0.505
## 3  1.000  0.693 -1.000   -1   -1   -1   -1   -1 -0.966  0.988  1.000 -0.893
## 4  1.000  0.488 -1.000   -1   -1   -1   -1   -1 -1.000 -1.000 -1.000 -1.000
## 5  0.761 -0.731 -1.000   -1   -1   -1   -1   -1 -1.000 -1.000 -1.000  0.242
## 6  1.000 -0.092  0.751   -1   -1   -1   -1   -1 -1.000 -0.923  0.966 -0.107
##     V120 V121   V122   V123  V124   V125   V126   V127 V128 V129 V130 V131
## 1 -0.961   -1 -1.000 -0.550 0.485  0.996  0.867  0.092   -1   -1   -1   -1
## 2 -1.000   -1 -0.649  0.405 1.000  1.000  0.653 -0.838   -1   -1   -1   -1
## 3 -1.000   -1 -1.000 -0.397 1.000  0.903 -0.977 -1.000   -1   -1   -1   -1
## 4 -1.000   -1 -1.000  0.697 0.992 -0.458 -1.000 -1.000   -1   -1   -1   -1
## 5  1.000    1  0.319  0.259 1.000  0.742 -0.757 -1.000   -1   -1   -1   -1
## 6 -1.000   -1 -1.000 -0.300 0.854 -0.382  0.617 -1.000   -1   -1   -1   -1
##     V132   V133   V134   V135   V136   V137   V138   V139   V140   V141   V142
## 1  0.278  1.000  0.877 -0.824 -1.000 -0.905  0.145  0.977  1.000  1.000  1.000
## 2 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.550  0.993  1.000
## 3 -0.559  1.000  1.000 -0.297 -1.000 -1.000 -1.000 -0.611  1.000  0.873 -0.698
## 4 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.341  1.000  0.608 -1.000 -1.000
## 5 -1.000 -1.000 -1.000 -0.975 -0.467 -0.989 -1.000 -1.000 -0.171  0.998  0.669
## 6 -1.000 -0.409  1.000 -0.529 -1.000 -1.000 -1.000  0.048  0.614 -0.268  0.544
##     V143   V144 V145  V146   V147   V148   V149   V150   V151   V152   V153
## 1  0.990 -0.745   -1 -1.00 -0.950  0.847  1.000  0.327 -1.000 -1.000  0.355
## 2  0.618 -0.869   -1 -0.96 -0.512  0.134 -0.343 -0.796 -1.000 -1.000 -1.000
## 3 -0.552 -1.000   -1 -1.00 -1.000 -0.126  1.000  1.000  0.766 -0.764 -1.000
## 4 -1.000 -1.000   -1 -1.00 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
## 5 -0.945 -1.000   -1 -1.00 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
## 6 -1.000 -1.000   -1 -1.00 -1.000 -1.000  0.050  0.971 -0.839 -1.000 -1.000
##     V154   V155   V156   V157   V158   V159   V160 V161   V162  V163   V164
## 1  1.000  0.655 -0.109 -0.185  1.000  0.988 -0.723   -1 -1.000 -0.63  1.000
## 2 -1.000 -1.000 -1.000 -0.432  0.994  1.000  0.223   -1  0.426  1.00  1.000
## 3 -1.000 -0.577  1.000  0.933  0.484 -0.197 -1.000   -1 -1.000 -1.00 -0.818
## 4  0.471  0.998 -0.416 -1.000 -1.000 -1.000 -1.000   -1 -1.000 -1.00 -1.000
## 5 -1.000 -1.000 -1.000  0.228  1.000  0.038 -1.000   -1 -1.000 -1.00 -1.000
## 6 -1.000  0.172  0.526 -0.003  0.307 -1.000 -1.000   -1 -1.000 -1.00 -1.000
##     V165   V166   V167   V168   V169   V170   V171   V172   V173   V174   V175
## 1  1.000  0.068 -0.925  0.113  0.960  0.308 -0.884 -1.000 -0.075  1.000  0.641
## 2  1.000  0.214 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000  0.292  1.000
## 3 -0.355  0.334  1.000  0.868 -0.289 -0.677 -0.596  1.000  1.000  1.000 -0.581
## 4 -1.000 -1.000 -1.000 -1.000 -0.644  0.963  0.590 -0.999 -1.000 -1.000 -1.000
## 5 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.826  0.918  0.933
## 6  0.398  0.459 -1.000 -1.000 -1.000 -1.000  0.372  0.555  0.520 -0.045 -1.000
##     V176  V177   V178   V179   V180   V181   V182   V183 V184   V185   V186
## 1 -0.995 -1.00 -1.000 -0.677  1.000  1.000  0.753  0.341    1  0.707 -0.942
## 2  0.967 -0.88  0.449  1.000  0.896 -0.094 -0.750 -1.000   -1 -1.000 -1.000
## 3 -1.000 -1.00 -1.000 -1.000 -1.000 -1.000 -0.954  0.118    1  1.000  1.000
## 4 -1.000 -1.00 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000   -1  0.061  1.000
## 5 -0.794 -1.00 -1.000 -1.000 -0.666  0.337  0.224 -0.908   -1 -1.000 -1.000
## 6 -1.000 -1.00 -1.000 -1.000 -1.000  0.671  0.176 -1.000   -1 -1.000 -1.000
##     V187   V188   V189   V190   V191   V192   V193   V194   V195   V196   V197
## 1 -1.000 -1.000  0.545  1.000  0.027 -1.000 -1.000 -1.000 -0.903  0.792  1.000
## 2 -1.000 -1.000 -1.000 -0.627  1.000  1.000  0.198 -0.105  1.000  1.000  1.000
## 3  1.000  1.000  0.973 -0.092 -0.995 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
## 4 -0.079 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
## 5 -1.000 -1.000 -1.000  0.418  1.000 -0.258 -1.000 -1.000 -0.246  1.000  1.000
## 6  0.236  0.934  0.971 -0.712 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000  0.763
##     V198   V199   V200   V201   V202   V203   V204   V205   V206   V207   V208
## 1  1.000  1.000  1.000  0.536  0.184  0.812  0.837  0.978  0.864 -0.630 -1.000
## 2  0.639 -0.168 -0.314 -0.446 -1.000 -1.000 -0.999 -0.337  0.147  0.996  1.000
## 3 -1.000 -0.993 -0.464  0.046  0.290  0.457  1.000  0.721 -1.000 -1.000 -1.000
## 4 -1.000 -1.000 -1.000  0.773  0.958 -0.714 -1.000 -1.000 -1.000 -1.000 -1.000
## 5  0.355 -0.958 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.077  1.000  0.344
## 6  0.084 -1.000 -1.000 -1.000 -1.000  0.073  1.000  0.265 -1.000 -1.000 -1.000
##     V209   V210   V211   V212   V213   V214   V215   V216   V217   V218   V219
## 1 -1.000 -1.000 -1.000 -0.452  0.828  1.000  1.000  1.000  1.000  1.000  1.000
## 2  0.667 -0.808  0.065  0.993  1.000  1.000  1.000  1.000  0.996  0.970  0.970
## 3 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.426
## 4 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.545  0.989  0.432 -1.000
## 5 -1.000 -1.000  0.075  1.000  1.000  0.649  0.256 -0.200 -0.351 -0.733 -0.733
## 6 -1.000 -1.000 -1.000 -1.000  0.563  0.210 -1.000 -1.000 -0.930 -0.127  0.890
##     V220   V221   V222 V223   V224   V225 V226   V227   V228   V229   V230
## 1  1.000  1.000  0.135   -1 -1.000 -1.000   -1 -1.000 -1.000 -0.483  0.813
## 2  0.970  0.998  1.000    1  1.000  0.109   -1 -1.000 -0.830 -0.242  0.350
## 3  1.000  0.555 -1.000   -1 -1.000 -1.000   -1 -1.000 -1.000 -1.000 -1.000
## 4 -1.000 -1.000 -1.000   -1 -1.000 -1.000   -1 -1.000 -1.000 -1.000 -1.000
## 5 -0.733 -0.433  0.649    1  0.093 -1.000   -1 -0.959 -0.062  0.821  1.000
## 6  0.935 -0.845 -1.000   -1 -1.000 -1.000   -1 -1.000 -1.000  0.093  0.793
##     V231   V232   V233   V234   V235   V236   V237   V238   V239   V240  V241
## 1  1.000  1.000  1.000  1.000  1.000  1.000  0.219 -0.943 -1.000 -1.000 -1.00
## 2  0.800  1.000  1.000  1.000  1.000  1.000  1.000  1.000  1.000  0.616 -0.93
## 3 -1.000 -1.000 -1.000 -1.000  0.024  1.000  0.388 -1.000 -1.000 -1.000 -1.00
## 4 -1.000 -0.348  1.000  0.798 -0.935 -1.000 -1.000 -1.000 -1.000 -1.000 -1.00
## 5  1.000  1.000  1.000  1.000  1.000  1.000  1.000  1.000  0.583 -0.843 -1.00
## 6 -0.205  0.214  0.746  0.918  0.692  0.954 -0.882 -1.000 -1.000 -1.000 -1.00
##   V242 V243 V244   V245   V246   V247   V248   V249   V250   V251   V252   V253
## 1   -1   -1   -1 -1.000 -0.974 -0.429  0.304  0.823  1.000  0.482 -0.474 -0.991
## 2   -1   -1   -1 -1.000 -1.000 -0.858 -0.671 -0.671 -0.033  0.761  0.762  0.126
## 3   -1   -1   -1 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -0.109  1.000 -0.179
## 4   -1   -1   -1 -1.000 -1.000 -1.000 -0.318  1.000  0.536 -0.987 -1.000 -1.000
## 5   -1   -1   -1 -0.877 -0.326  0.174  0.466  0.639  1.000  1.000  0.791  0.439
## 6   -1   -1   -1 -0.898  0.323  1.000  0.803  0.015 -0.862 -0.871 -0.437 -1.000
##     V254   V255   V256 V257
## 1 -1.000 -1.000 -1.000   -1
## 2 -0.095 -0.671 -0.828   -1
## 3 -1.000 -1.000 -1.000   -1
## 4 -1.000 -1.000 -1.000   -1
## 5 -0.199 -0.883 -1.000   -1
## 6 -1.000 -1.000 -1.000   -1
str(data2)
## 'data.frame':    9298 obs. of  257 variables:
##  $ Numero: Factor w/ 10 levels "cero","cinco",..: 7 2 3 8 9 7 9 10 1 10 ...
##  $ V2    : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V3    : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V4    : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V5    : num  -1 -0.813 -1 -1 -1 -1 -0.83 -1 -1 -1 ...
##  $ V6    : num  -1 -0.671 -1 -1 -1 -1 0.442 -1 -1 -1 ...
##  $ V7    : num  -1 -0.809 -1 -0.273 -0.928 -0.397 1 -1 -0.454 -1 ...
##  $ V8    : num  -1 -0.887 -1 0.684 -0.204 0.983 1 -1 0.879 -1 ...
##  $ V9    : num  -0.631 -0.671 -1 0.96 0.751 -0.535 0.479 0.51 -0.745 -0.909 ...
##  $ V10   : num  0.862 -0.853 -1 0.45 0.466 -1 -0.328 -0.213 -1 0.801 ...
##  $ V11   : num  -0.167 -1 -0.996 -0.067 0.234 -1 -0.947 -1 -1 -0.899 ...
##  $ V12   : num  -1 -1 0.147 -0.679 -0.809 -1 -1 -1 -1 -1 ...
##  $ V13   : num  -1 -0.774 1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V14   : num  -1 -0.18 -0.189 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V15   : num  -1 0.052 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V16   : num  -1 -0.241 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V17   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V18   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V19   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V20   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V21   : num  -1 0.392 -1 -1 -1 -1 -0.025 -1 -1 -1 ...
##  $ V22   : num  -1 1 -1 -0.114 -0.37 -1 0.519 -1 -0.716 -1 ...
##  $ V23   : num  -1 0.857 -1 0.974 0.739 0.692 0.124 -1 0.804 -1 ...
##  $ V24   : num  -0.992 0.727 -1 0.917 1 0.536 0.339 -1 1 -1 ...
##  $ V25   : num  0.297 1 -1 0.734 1 -0.767 0.762 0.292 0.42 -0.405 ...
##  $ V26   : num  1 0.805 -1 0.994 1 -1 1 0.792 -0.664 1 ...
##  $ V27   : num  0.307 0.613 -0.882 1 1 -1 0.456 -0.987 -1 -0.396 ...
##  $ V28   : num  -1 0.613 1 0.973 0.644 -1 -0.707 -1 -1 -1 ...
##  $ V29   : num  -1 0.86 0.39 0.391 -0.89 -1 -1 -1 -1 -1 ...
##  $ V30   : num  -1 1 -0.811 -0.421 -1 -1 -1 -1 -1 -1 ...
##  $ V31   : num  -1 1 -1 -0.976 -1 -1 -1 -1 -1 -1 ...
##  $ V32   : num  -1 0.396 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V33   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V34   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V35   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V36   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V37   : num  -1 -0.548 -1 -0.323 -1 -1 -1 -1 -0.978 -1 ...
##  $ V38   : num  -1 1 -1 0.991 0.616 -0.921 -1 -1 0.713 -1 ...
##  $ V39   : num  -1 1 -1 0.622 1 0.928 -1 -1 1 -1 ...
##  $ V40   : num  -0.41 1 -1 -0.738 0.688 -0.118 -1 -1 0.027 -1 ...
##  $ V41   : num  1 1 -1 -1 -0.455 -1 -0.965 0.56 0.408 -0.072 ...
##  $ V42   : num  0.986 1 -1 -0.639 -0.731 -1 -0.086 0.975 0.947 1 ...
##  $ V43   : num  -0.565 1 -0.715 0.023 0.659 -1 0.843 -0.873 0.56 -0.468 ...
##  $ V44   : num  -1 1 1 0.871 1 -1 0.681 -1 -0.538 -1 ...
##  $ V45   : num  -1 1 0.029 1 -0.287 -1 -0.955 -1 -1 -1 ...
##  $ V46   : num  -1 1 -1 1 -1 -1 -1 -1 -1 -1 ...
##  $ V47   : num  -1 1 -1 -0.432 -1 -1 -1 -1 -1 -1 ...
##  $ V48   : num  -1 0.875 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V49   : num  -1 -0.957 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V50   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V51   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V52   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V53   : num  -1 -0.786 -1 0.409 -1 -1 -1 -1 -0.118 -1 ...
##  $ V54   : num  -1 0.961 -0.888 1 -0.376 -0.394 -1 -1 1 -1 ...
##  $ V55   : num  -0.683 1 -0.912 0 -0.186 1 -1 -1 0.665 -1 ...
##  $ V56   : num  0.825 1 -1 -1 -0.874 -0.596 -1 -1 -0.902 -1 ...
##  $ V57   : num  1 1 -1 -1 -1 -1 -1 0.745 -0.969 0.057 ...
##  $ V58   : num  0.562 0.727 -1 -1 -1 -1 -1 0.999 -0.36 1 ...
##  $ V59   : num  -1 0.403 -0.549 -1 -0.014 -1 -0.467 -0.748 0.805 -0.623 ...
##  $ V60   : num  -1 0.403 1 -0.842 1 -1 1 -1 0.987 -1 ...
##  $ V61   : num  -1 0.171 0.361 0.714 -0.253 -1 -0.279 -1 0.327 -1 ...
##  $ V62   : num  -1 -0.314 -1 1 -1 -1 -1 -1 -0.797 -1 ...
##  $ V63   : num  -1 -0.314 -1 -0.534 -1 -1 -1 -1 -1 -1 ...
##  $ V64   : num  -1 -0.94 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V65   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V66   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V67   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V68   : num  -1 -1 -1 -0.879 -1 -1 -1 -1 -0.935 -1 ...
##  $ V69   : num  -1 -0.298 -0.938 0.965 -1 -1 -1 -1 0.764 -1 ...
##  $ V70   : num  -0.938 1 0.694 1 -1 0.06 -1 -1 1 -1 ...
##  $ V71   : num  0.54 1 0.057 -0.713 -1 0.9 -1 -1 -0.367 -1 ...
##  $ V72   : num  1 1 -1 -1 -1 -0.951 -1 -1 -1 -1 ...
##  $ V73   : num  0.778 0.44 -1 -1 -1 -1 -1 0.596 -1 0.288 ...
##  $ V74   : num  -0.715 0.056 -1 -1 -0.978 -1 -1 1 -1 1 ...
##  $ V75   : num  -1 -0.755 -0.382 -1 0.501 -1 -0.719 -0.601 -0.914 -0.683 ...
##  $ V76   : num  -1 -1 1 -0.606 1 -0.647 1 -1 -0.256 -1 ...
##  $ V77   : num  -1 -1 0.511 0.977 -0.54 0.455 -0.203 -1 0.833 -1 ...
##  $ V78   : num  -1 -1 -1 0.695 -1 -0.333 -1 -1 0.778 -1 ...
##  $ V79   : num  -1 -1 -1 -0.906 -1 -1 -1 -1 -0.22 -1 ...
##  $ V80   : num  -1 -1 -1 -1 -1 -1 -1 -1 -0.992 -1 ...
##  $ V81   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V82   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V83   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V84   : num  -1 -1 -1 -0.528 -1 -1 -1 -1 -0.256 -1 ...
##  $ V85   : num  -1 0.366 -0.311 1 -1 -1 -1 -1 1 -1 ...
##  $ V86   : num  0.1 1 1 0.931 -1 0.259 -1 -1 0.538 -1 ...
##  $ V87   : num  1 1 -0.043 -0.888 -0.998 0.676 -1 -1 -0.986 -1 ...
##  $ V88   : num  0.922 1 -1 -1 -0.341 -1 -1 -1 -1 -1 ...
##  $ V89   : num  -0.439 1 -1 -1 0.296 -1 -1 0.714 -1 0.253 ...
##  $ V90   : num  -1 1 -1 -1 0.371 -1 -0.786 1 -1 1 ...
##  $ V91   : num  -1 0.889 -0.648 -0.949 1 -0.984 0.504 -0.585 -1 -0.647 ...
##  $ V92   : num  -1 -0.081 1 0.559 0.417 0.677 0.945 -1 -1 -1 ...
##  $ V93   : num  -1 -0.92 0.644 0.984 -0.989 0.981 -0.801 -1 -0.837 -1 ...
##  $ V94   : num  -1 -1 -1 -0.363 -1 0.551 -1 -1 0.551 -1 ...
##  $ V95   : num  -1 -1 -1 -1 -1 -1 -1 -1 1 -1 ...
##  $ V96   : num  -1 -1 -1 -1 -1 -1 -1 -1 -0.285 -1 ...
##  $ V97   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V98   : num  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ V99   : num  -1 -1 -1 -1 -1 -1 -1 -1 -0.936 -1 ...
##   [list output truncated]
equilibrio.variable.predecir(data2,"Numero")

Es un problema desequilibrado.

  1. Use el m´etodo de M´aquinas de Soporte Vectorial con el n´ucleo y los par´ametros que usted considere m´as conveniente para generar un modelo predictivo para la tabla ZipData 2020.csv usando el 80 % de los datos para la tabla aprendizaje y un 20 % para la tabla testing, luego calcule para los datos de testing la matriz de confusi´on, la precisi´on global y la precisi´on para cada una de las categor´ıas. ¿Son buenos los resultados? Explique.
library(traineR)
muestra <- sample(1:nrow(data2),floor(nrow(data2)*0.20))
ttesting <- data2[muestra,]
taprendizaje <- data2[-muestra,]
modelo <- train.svm(Numero ~ .,data = taprendizaje, kernel = "radial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediction
## real     cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    308     0      0   2     0    0    0     0    1   0
##   cinco     1   144      1   1     0    1    0     0    1   0
##   cuatro    0     0    160   2     0    2    2     0    0   1
##   dos       0     0      1 170     0    1    0     0    0   0
##   nueve     0     1      1   1   147    0    0     2    0   0
##   ocho      1     5      0   1     1  139    1     0    0   1
##   seis      0     0      0   2     0    0  158     0    0   0
##   siete     0     0      4   1     1    3    0   161    0   0
##   tres      0     3      1   4     0    5    0     0  177   1
##   uno       0     0      1   1     0    0    1     0    0 235
## 
## $`Precisión Global`
## [1] 0.9677246
## 
## $`Error Global`
## [1] 0.03227542
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9903537 0.9664430 0.9580838 0.9883721 0.9671053 0.9328859 0.9875000 0.9470588 
##      tres       uno 
## 0.9267016 0.9873950 
## 
## $`Precision Positiva`
## [1] 0.9931034
## 
## $`Precision Negativa`
## [1] 1
## 
## $`Falsos Positivos`
## [1] 0
## 
## $`Falsos Negativos`
## [1] 0.006896552
## 
## $`Asertividad Positiva`
## [1] 1
## 
## $`Asertividad Negativa`
## [1] 0.9967638
library(traineR)

modelo <- train.svm(Numero ~ .,data = taprendizaje, kernel = "polynomial")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediction
## real     cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    306     1      0   2     0    2    0     0    0   0
##   cinco     0   144      1   1     0    1    1     0    1   0
##   cuatro    0     0    162   1     1    1    1     0    0   1
##   dos       0     0      1 166     0    4    0     0    1   0
##   nueve     0     0      1   0   149    1    0     1    0   0
##   ocho      0     2      0   0     0  146    0     0    1   0
##   seis      0     0      0   2     0    1  157     0    0   0
##   siete     0     0      5   0     4    3    0   158    0   0
##   tres      0     3      1   2     0    4    0     0  181   0
##   uno       0     1      2   0     0    0    1     0    0 234
## 
## $`Precisión Global`
## [1] 0.9698763
## 
## $`Error Global`
## [1] 0.03012372
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9839228 0.9664430 0.9700599 0.9651163 0.9802632 0.9798658 0.9812500 0.9294118 
##      tres       uno 
## 0.9476440 0.9831933 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0.9967427
## 
## $`Falsos Positivos`
## [1] 0.003257329
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9931034
## 
## $`Asertividad Negativa`
## [1] 1
library(traineR)

modelo <- train.svm(Numero ~ .,data = taprendizaje, kernel = "sigmoid")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediction
## real     cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    288    12      3   3     0    1    2     0    2   0
##   cinco     9   118      3   0     1    4    0     1   13   0
##   cuatro    4     1    152   1     1    4    3     0    0   1
##   dos      10     0      4 146     0    3    8     1    0   0
##   nueve     1     2      2   0   141    0    0     6    0   0
##   ocho      4     4      2   0     1  132    1     1    3   1
##   seis      1     0      0   1     0    0  158     0    0   0
##   siete     1     0      4   1     4    3    0   157    0   0
##   tres      2     5      1   2     0    5    0     2  172   2
##   uno       0     0      1   0     0    0    1     0    0 236
## 
## $`Precisión Global`
## [1] 0.9144701
## 
## $`Error Global`
## [1] 0.08552985
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9260450 0.7919463 0.9101796 0.8488372 0.9276316 0.8859060 0.9875000 0.9235294 
##      tres       uno 
## 0.9005236 0.9915966 
## 
## $`Precision Positiva`
## [1] 0.9291339
## 
## $`Precision Negativa`
## [1] 0.96
## 
## $`Falsos Positivos`
## [1] 0.04
## 
## $`Falsos Negativos`
## [1] 0.07086614
## 
## $`Asertividad Positiva`
## [1] 0.9076923
## 
## $`Asertividad Negativa`
## [1] 0.969697
library(traineR)

modelo <- train.svm(Numero ~ .,data = taprendizaje, kernel = "linear")
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediction
## real     cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    307     1      0   1     0    0    1     0    1   0
##   cinco     2   134      3   0     0    1    4     1    4   0
##   cuatro    0     0    160   1     0    0    3     1    0   2
##   dos       0     0      3 161     1    1    3     0    3   0
##   nueve     0     0      3   0   143    0    0     6    0   0
##   ocho      2     2      1   1     1  136    0     0    4   2
##   seis      0     1      0   1     0    0  158     0    0   0
##   siete     1     1      4   0     3    1    0   159    1   0
##   tres      0     5      1   3     1    4    0     0  177   0
##   uno       0     0      1   0     0    0    1     0    0 236
## 
## $`Precisión Global`
## [1] 0.9526627
## 
## $`Error Global`
## [1] 0.04733728
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9871383 0.8993289 0.9580838 0.9360465 0.9407895 0.9127517 0.9875000 0.9352941 
##      tres       uno 
## 0.9267016 0.9915966 
## 
## $`Precision Positiva`
## [1] 0.9852941
## 
## $`Precision Negativa`
## [1] 0.9967532
## 
## $`Falsos Positivos`
## [1] 0.003246753
## 
## $`Falsos Negativos`
## [1] 0.01470588
## 
## $`Asertividad Positiva`
## [1] 0.9925926
## 
## $`Asertividad Negativa`
## [1] 0.9935275
modelo <- train.svm(Numero ~ .,data = taprendizaje)
prediccion <- predict(modelo, ttesting , type = "class")
MC <- confusion.matrix(ttesting, prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediction
## real     cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    308     0      0   2     0    0    0     0    1   0
##   cinco     1   144      1   1     0    1    0     0    1   0
##   cuatro    0     0    160   2     0    2    2     0    0   1
##   dos       0     0      1 170     0    1    0     0    0   0
##   nueve     0     1      1   1   147    0    0     2    0   0
##   ocho      1     5      0   1     1  139    1     0    0   1
##   seis      0     0      0   2     0    0  158     0    0   0
##   siete     0     0      4   1     1    3    0   161    0   0
##   tres      0     3      1   4     0    5    0     0  177   1
##   uno       0     0      1   1     0    0    1     0    0 235
## 
## $`Precisión Global`
## [1] 0.9677246
## 
## $`Error Global`
## [1] 0.03227542
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9903537 0.9664430 0.9580838 0.9883721 0.9671053 0.9328859 0.9875000 0.9470588 
##      tres       uno 
## 0.9267016 0.9873950 
## 
## $`Precision Positiva`
## [1] 0.9931034
## 
## $`Precision Negativa`
## [1] 1
## 
## $`Falsos Positivos`
## [1] 0
## 
## $`Falsos Negativos`
## [1] 0.006896552
## 
## $`Asertividad Positiva`
## [1] 1
## 
## $`Asertividad Negativa`
## [1] 0.9967638
library(class)
library(e1071)
modelo <- svm(Numero~., data = taprendizaje)
modelo
## 
## Call:
## svm(formula = Numero ~ ., data = taprendizaje)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
## 
## Number of Support Vectors:  2732
prediccion <- predict(modelo,ttesting)
MC<-table(ttesting[,1],prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediccion
##          cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    308     0      0   2     0    0    0     0    1   0
##   cinco     1   144      1   1     0    1    0     0    1   0
##   cuatro    0     0    160   2     0    2    2     0    0   1
##   dos       0     0      1 170     0    1    0     0    0   0
##   nueve     0     1      1   1   147    0    0     2    0   0
##   ocho      1     5      0   1     1  139    1     0    0   1
##   seis      0     0      0   2     0    0  158     0    0   0
##   siete     0     0      4   1     1    3    0   161    0   0
##   tres      0     3      1   4     0    5    0     0  177   1
##   uno       0     0      1   1     0    0    1     0    0 235
## 
## $`Precisión Global`
## [1] 0.9677246
## 
## $`Error Global`
## [1] 0.03227542
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9903537 0.9664430 0.9580838 0.9883721 0.9671053 0.9328859 0.9875000 0.9470588 
##      tres       uno 
## 0.9267016 0.9873950 
## 
## $`Precision Positiva`
## [1] 0.9931034
## 
## $`Precision Negativa`
## [1] 1
## 
## $`Falsos Positivos`
## [1] 0
## 
## $`Falsos Negativos`
## [1] 0.006896552
## 
## $`Asertividad Positiva`
## [1] 1
## 
## $`Asertividad Negativa`
## [1] 0.9967638
modelo <- svm(Numero~., data = taprendizaje, kernel="radial")
prediccion <- predict(modelo,ttesting)
MC<-table(ttesting[,1],prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediccion
##          cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    308     0      0   2     0    0    0     0    1   0
##   cinco     1   144      1   1     0    1    0     0    1   0
##   cuatro    0     0    160   2     0    2    2     0    0   1
##   dos       0     0      1 170     0    1    0     0    0   0
##   nueve     0     1      1   1   147    0    0     2    0   0
##   ocho      1     5      0   1     1  139    1     0    0   1
##   seis      0     0      0   2     0    0  158     0    0   0
##   siete     0     0      4   1     1    3    0   161    0   0
##   tres      0     3      1   4     0    5    0     0  177   1
##   uno       0     0      1   1     0    0    1     0    0 235
## 
## $`Precisión Global`
## [1] 0.9677246
## 
## $`Error Global`
## [1] 0.03227542
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9903537 0.9664430 0.9580838 0.9883721 0.9671053 0.9328859 0.9875000 0.9470588 
##      tres       uno 
## 0.9267016 0.9873950 
## 
## $`Precision Positiva`
## [1] 0.9931034
## 
## $`Precision Negativa`
## [1] 1
## 
## $`Falsos Positivos`
## [1] 0
## 
## $`Falsos Negativos`
## [1] 0.006896552
## 
## $`Asertividad Positiva`
## [1] 1
## 
## $`Asertividad Negativa`
## [1] 0.9967638
modelo <- svm(Numero~., data = taprendizaje, kernel="linear")
prediccion <- predict(modelo,ttesting)
MC<-table(ttesting[,1],prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediccion
##          cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    307     1      0   1     0    0    1     0    1   0
##   cinco     2   134      3   0     0    1    4     1    4   0
##   cuatro    0     0    160   1     0    0    3     1    0   2
##   dos       0     0      3 161     1    1    3     0    3   0
##   nueve     0     0      3   0   143    0    0     6    0   0
##   ocho      2     2      1   1     1  136    0     0    4   2
##   seis      0     1      0   1     0    0  158     0    0   0
##   siete     1     1      4   0     3    1    0   159    1   0
##   tres      0     5      1   3     1    4    0     0  177   0
##   uno       0     0      1   0     0    0    1     0    0 236
## 
## $`Precisión Global`
## [1] 0.9526627
## 
## $`Error Global`
## [1] 0.04733728
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9871383 0.8993289 0.9580838 0.9360465 0.9407895 0.9127517 0.9875000 0.9352941 
##      tres       uno 
## 0.9267016 0.9915966 
## 
## $`Precision Positiva`
## [1] 0.9852941
## 
## $`Precision Negativa`
## [1] 0.9967532
## 
## $`Falsos Positivos`
## [1] 0.003246753
## 
## $`Falsos Negativos`
## [1] 0.01470588
## 
## $`Asertividad Positiva`
## [1] 0.9925926
## 
## $`Asertividad Negativa`
## [1] 0.9935275
modelo <- svm(Numero~., data = taprendizaje, kernel="polynomial")
prediccion <- predict(modelo,ttesting)
MC<-table(ttesting[,1],prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediccion
##          cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    306     1      0   2     0    2    0     0    0   0
##   cinco     0   144      1   1     0    1    1     0    1   0
##   cuatro    0     0    162   1     1    1    1     0    0   1
##   dos       0     0      1 166     0    4    0     0    1   0
##   nueve     0     0      1   0   149    1    0     1    0   0
##   ocho      0     2      0   0     0  146    0     0    1   0
##   seis      0     0      0   2     0    1  157     0    0   0
##   siete     0     0      5   0     4    3    0   158    0   0
##   tres      0     3      1   2     0    4    0     0  181   0
##   uno       0     1      2   0     0    0    1     0    0 234
## 
## $`Precisión Global`
## [1] 0.9698763
## 
## $`Error Global`
## [1] 0.03012372
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9839228 0.9664430 0.9700599 0.9651163 0.9802632 0.9798658 0.9812500 0.9294118 
##      tres       uno 
## 0.9476440 0.9831933 
## 
## $`Precision Positiva`
## [1] 1
## 
## $`Precision Negativa`
## [1] 0.9967427
## 
## $`Falsos Positivos`
## [1] 0.003257329
## 
## $`Falsos Negativos`
## [1] 0
## 
## $`Asertividad Positiva`
## [1] 0.9931034
## 
## $`Asertividad Negativa`
## [1] 1
modelo <- svm(Numero~., data = taprendizaje, kernel="sigmoid")
prediccion <- predict(modelo,ttesting)
MC<-table(ttesting[,1],prediccion)
indices.general(MC)
## $`Matriz de Confusión`
##         prediccion
##          cero cinco cuatro dos nueve ocho seis siete tres uno
##   cero    288    12      3   3     0    1    2     0    2   0
##   cinco     9   118      3   0     1    4    0     1   13   0
##   cuatro    4     1    152   1     1    4    3     0    0   1
##   dos      10     0      4 146     0    3    8     1    0   0
##   nueve     1     2      2   0   141    0    0     6    0   0
##   ocho      4     4      2   0     1  132    1     1    3   1
##   seis      1     0      0   1     0    0  158     0    0   0
##   siete     1     0      4   1     4    3    0   157    0   0
##   tres      2     5      1   2     0    5    0     2  172   2
##   uno       0     0      1   0     0    0    1     0    0 236
## 
## $`Precisión Global`
## [1] 0.9144701
## 
## $`Error Global`
## [1] 0.08552985
## 
## $`Precisión por categoría`
##      cero     cinco    cuatro       dos     nueve      ocho      seis     siete 
## 0.9260450 0.7919463 0.9101796 0.8488372 0.9276316 0.8859060 0.9875000 0.9235294 
##      tres       uno 
## 0.9005236 0.9915966 
## 
## $`Precision Positiva`
## [1] 0.9291339
## 
## $`Precision Negativa`
## [1] 0.96
## 
## $`Falsos Positivos`
## [1] 0.04
## 
## $`Falsos Negativos`
## [1] 0.07086614
## 
## $`Asertividad Positiva`
## [1] 0.9076923
## 
## $`Asertividad Negativa`
## [1] 0.969697
  1. Compare los resultados con los obtenidos en las tareas anteriores.

Con una precision global de 0.964497 el SVM radial es el que mejor estima la variabilidad del modelo la peor estimacion de svm es con sigmoid una precision global 0.9117805. Los resultados como seria de esperar son iguales aplicando algoritmo SVM y traineR. A diferencia de los metodos de estimacion de las demas tareas el SVM ademas de tener una precision global alta, tambien tiene una precision por categoria bastante elevada en todos los numeros. Es decir kvecinos tambien tuvo una precision global alta pero no es preciso con todos los numeros por igual. Debe senalarse que de los modelos anteriores el de arboles de decision tiene peor desempeno. A pesar de ello, puede senalarse la red neuronal tanto nnet como neuralnet tardan mucho en procesar los datos, mucho mas que en el caso de los kvecinos, por lo que, para el uso de equipo con baja capacidad de procesamiento puede resultar mas optimo SVM o incluso kvencinos. En el caso de los kvecinos se obtuvo precision global de 0.9585799, aun con kvecinos es superior que con la aproximacion de redes nnet (0.8682087).

Pregunta 4: [25 puntos] Suponga que se tiene la siguiente tabla de datos:

  1. Dibuje con colores los puntos de ambas clases en R3
library ( plotly )
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
datos <- data.frame(x = c(1, 1, 1, 3, 1, 3, 1, 3, 1), y = c(0, 0, 1, 1, 1, 2, 2, 2, 1), z = c(1, 2, 2, 4, 3, 3, 1, 1, 0), clase = c(" Rojo ", " Rojo ", " Rojo ", " Rojo ", " Rojo ", " Azul "," Azul ", " Azul ", " Azul "))

plot_ly (data = datos) %>% add_trace (x = ~x, y = ~y, z = ~z, color = ~clase, colors = c("#0C4B8E", "#BF382A"), mode = "markers ", type = "scatter3d")
  1. Dibuje el hiperplano ´optimo de separaci´on e indique la ecuaci´on de dicho hiperplano de la forma ax+by +cz +d = 01 . Nota: Se debe observar con detenimiento los puntos de ambas clases para encontrar los vectores de soporte de cada margen y trazar con estos puntos los hiperplanos de los m´argenes luego trazar el hiperplano de soporte justo en el centro.
getwd()
## [1] "C:/Users/rzamoram/Documents/Machine Learning/Mineria de Datos I/Clase5"
setwd("C:/Users/rzamoram/Documents/Machine Learning/Mineria de Datos I/Clase3")
library ( plotly )
observaciones <- data.frame(x = c(1, 1, 1, 3, 1, 3, 1, 3, 1), 
                            y = c(0, 0, 1, 1, 1, 2, 2, 2, 1), 
                            z = c(1, 2, 2, 4,3, 3, 1, 1, 0), 
                            clase = c(" Rojo ", " Rojo ", " Rojo ", " Rojo ", " Rojo ", " Azul "," Azul ", " Azul", " Azul "))
observaciones$clase <- as.factor(observaciones$clase)
                      
ggplot() +
  geom_point(data = observaciones, aes(x = x, y = y, color = clase), size = 4) +
  theme_bw() +
  labs(title = "Posibles hiperplanos de separación") +
  theme( legend.position = "none",
  plot.title = element_text(hjust = 0.5, size = 11))

ecuacion de hiperplano = x+y+0.5z+0.5=0

  1. Escriba la regla de clasificaci´on para el clasificador con margen m´aximo. Debe ser algo como lo siguiente: w = (w1, w2, w3) se clasifica como Rojo si ax + by + cz + d > 0 y otro caso se clasifica como Azul.
x1 <- c(1, 1, 1, 3, 1, 3, 1, 3, 1)
x2 <- c(0, 0, 1, 1, 1, 2, 2, 2, 1)
y <- c(" Red ", " Red ", " Red ", " Red ", " Red ", " Blue "," Blue ", " Blue ", " Blue ")
m1 <- (4-2)/(4-2) # m = (y2-y1)/(x2-x1)
b1 <- 4-1*4 # b = y -mx
m2 <- (3-1)/(4-2)
b2 <- 3-1*4


library(plotrix)
## 
## Attaching package: 'plotrix'
## The following object is masked from 'package:scales':
## 
##     rescale
bbdd <- data.frame(x1,x2,y)
plot(x1,x2,xlim=c(0,8),ylim=c(0,8),col=c(y))
legend("topleft", 
       c("h(x)=x+0, vectores de soporte: (2,2) y  (4,4)",
         "Hiperplano no óptimo: x1-x2-0.25=0",
         "Hiperplano: x1-x2-0.5 = 0",
         "g(x)=x-1, vectores de soporte: (2,1) y (4,3"), cex=0.7, col=c("red","green", "black","blue"), lty=c(2,1,1,2))
abline (b1,m1,col="red",lty=2)
abline (b2,m2,col="blue",lty=2)
abline (-0.5,1)
abline (-0.25,1,col="green")
arrows(6.3,4,6,5,length=0.1)
arrows(5.5,7,5.8,5.8,length=0.1)
legend(5.5,3.8,"margen",cex=0.7,bty="n")
legend("bottomright","Círculos: vectores de soporte",cex=0.6)
draw.circle(2,2,0.25)
draw.circle(4,4,0.25)
draw.circle(2,1,0.25)
draw.circle(4,3,0.25)

  1. Indique el margen para el hiperplano ´optimo y los vectores de soporte.

hiperplano optimo = x-y-0.5z-0.5=0 vectores de soporte = (2,2), (4,4) y (2,2) vectores de soporte = (2,1), (4,3) y (2,1)

  1. Explique por qu´e un ligero movimiento de la octava observaci´on no afectar´ıa el hiperplano de margen m´aximo.

Esta octava observacion se encuentra bastante separada y alejada de la linea de separacion caracteristica del SVM por lo que pequenos cambios no deberian afectar la distincion entre variables.

  1. Dibuje un hiperplano que no es el hiperplano ´optimo de separaci´on y proporcione la ecuaci´on para este hiperplano.
x1 <- c(1, 1, 1, 3, 2, 1, 1, 3, 1)
x2 <- c(1, 0, 1, 2, 1, 0, 2, 2, 1)
y <- c(" Red ", " Red ", " Red ", " Red ", " Red ", " Blue "," Blue ", " Blue ", " Blue ")
m1 <- (4-2)/(4-2) # m = (y2-y1)/(x2-x1)
b1 <- 4-1*4 # b = y -mx
m2 <- (3-1)/(4-2)
b2 <- 3-1*4


library(plotrix)
bbdd <- data.frame(x1,x2,y)
plot(x1,x2,xlim=c(0,8),ylim=c(0,8),col=c(y))
legend("topleft", 
       c("h(x)=x+0, vectores de soporte: (2,2) y  (4,4)",
         "Hiperplano no óptimo: x1-x2-0.25=0",
         "Hiperplano: x1-x2-0.5 = 0",
         "g(x)=x-1, vectores de soporte: (2,1) y (4,3"), cex=0.7, col=c("red","green", "black","blue"), lty=c(2,1,1,2))
abline (b1,m1,col="red",lty=2)
abline (b2,m2,col="blue",lty=2)
abline (-0.5,1)
abline (-0.25,1,col="green")
arrows(6.3,4,6,5,length=0.1)
arrows(5.5,7,5.8,5.8,length=0.1)
legend(5.5,3.8,"margen",cex=0.7,bty="n")
legend("bottomright","Círculos: vectores de soporte",cex=0.6)
draw.circle(2,2,0.25)
draw.circle(4,4,0.25)
draw.circle(2,1,0.25)
draw.circle(4,3,0.25)

Aqui se denota dificultad para separar los casos de hecho se traslapan no hay hiperplano de separaacion Ecuacion hiperplano = x1-x2-0.5=0 Ecuacion no optimo = x1 - x2-0.25=0

  1. Dibuje un hiperplano de separaci´on pero que no es el hiperplano ´optimo de separaci´on, y escriba la ecuaci´on correspondiente.
bbdd <- data.frame(x1,x2,y)
plot(x1,x2,xlim=c(0,8),ylim=c(0,8),col=c(y))
abline (b1,m1,col="red",lty=2)
abline (b2,m2,col="blue",lty=2)
abline (-0.5,1)
points(2,7,col="blue")
legend(0,7,"separable",cex=0.6,bty="n")

(2,7 resulta no separable) Hiperplano: x1-x2-2.7 = 0